package API.BigIntegerDome;

import java.math.BigInteger;

/**
 * ClassName:BigIntegerText001
 * Package:API.BigIntegerDome
 * Description:
 *
 * @Author:ZhangXin
 * @Create2023/1/31-15:10
 * @Version:v1.0
 */
public class BigIntegerText001 {
    /*
     * 在Java中,整数有四种类型：byte,short,int,long
     * 在底层占用字节数：
     * byte - 1个字节
     * short- 2个字节
     * int  - 4个字节
     * long - 8个字节*/

    /*
     * BigInteger构造方法
     * public BigInteger(int num, Random rnd) 获取随机大整数,范围[0~2的num次方-1]
     * public BigInteger(String val) 获取指定的大整数
     * public BigInteger(String val, int radix) 获取指定进制的大整数
     *
     * public static BigInteger valueOf(long val) 静态方法获取BigInteger的对象,内部有优化
     *
     * 对象一旦创建,内部记录的值不能发生改变*/
    public static void main(String[] args) {
        //获取一个随机大整数
//        for (int i = 0; i < 100; i++) {
//            BigInteger bd1 = new BigInteger(4,new Random());//在0到2的4次方-1之间获取一个整数
//            System.out.println(bd1);
//        }
//
        //获取一个指定的大整数
        //注意：字符串中必须是整数,否则会报错
//        BigInteger bd2 = new BigInteger("1000000000000000000000000000000000000000000000000000000000000000000000");
//        System.out.println(bd2);
//        BigInteger bd3 = new BigInteger("1.1");
//        System.out.println(bd3);

        //public BigInteger(String val, int radix) 获取指定进制的大整数
        /*
         * 注意：
         * 1.字符串中的数字必须是整数
         * 2.字符串中的数字必须要跟进制吻合
         * 比如二进制中只能写0和1*/
        BigInteger bd4 = new BigInteger("100", 8);
        System.out.println(bd4);


        //public static BigInteger valueOf(long val) 静态方法获取BigInteger的对象,内部有优化
        /*
         * 注意：
         * 1.能表示范围较小,在long的取值范围之间,如果超出了long的范围就不行了
         * 2.在内部对常用的数字:-16 ~ 16 进行了优化
         * (提前把-16 ~ 16 先创建好BigInteger的对象,如果多次获取不会重新创建新的)*/
//        BigInteger bd5 = BigInteger.valueOf(100);
//        System.out.println(bd5);
//
//        BigInteger bd6 = BigInteger.valueOf(9797696967856856L);
//        System.out.println(bd6);

        BigInteger bd5 = BigInteger.valueOf(16);
        BigInteger bd6 = BigInteger.valueOf(16);
        System.out.println(bd5 == bd6);//true

        BigInteger bd7 = BigInteger.valueOf(17);
        BigInteger bd8 = BigInteger.valueOf(17);
        System.out.println(bd7 == bd8);//false 超出范围

        //对象一旦创建内部的数据不能发生改变
        BigInteger bd9 = BigInteger.valueOf(1);
        BigInteger bd10 = BigInteger.valueOf(2);
        BigInteger result = bd9.add(bd10);
        System.out.println(result);
        //此时,不会修改参与计算的BigInteger对象中的值,而是产生一个新的BigInteger对象
        System.out.println(bd9 == result);//false
        System.out.println(bd10 == result);//false

        /*
        * 1.如果BigInteger表示的数字没有超出long的范围,可以用静态方法获取
        * 2.如果BigInteger表示的超出long的范围,可以用构造方法获取
        * 3.对象一旦创建,BigInteger内部记录的值不能发生改变
        * 4.只要进行计算都会产生一个新的BigInteger对象*/


    }
}
